home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1997 January / macformat46.iso / Demos / PowerFantasm 4.15 / Beginners guide / EDIT EXAMPLE / FILE_IO.S < prev    next >
Encoding:
Text File  |  1996-06-21  |  7.5 KB  |  331 lines

  1. ******************************************************************************************
  2. *FILE I/O FOR FANTASM                                                                    *
  3. *010694                                                                                  *
  4. ******************************************************************************************
  5. GETRESOURCE:    EQU    $A9A0
  6.  
  7. ********************SECTION 15****************************************************
  8. **READ_TEFILE CALLS ALL THE NECESSARY ROUTINES TO GET A FILE IN TE
  9. **NEEDS A0=FILENAME
  10. **      D0=VOLPTR
  11. READ_TEFILE:    BSR    OPEN_F    SET UP PB AND OPEN FILE
  12.     TST.W    D0
  13.     BGE.S    RTE_OPEN_OK
  14.     MOVE.W    #OPEN_GENERAL,D0
  15.     BSR    DO_ALERT
  16.     CLR.L    D0
  17.     RTS
  18. RTE_OPEN_OK:    MOVE.W    #32000,MAX_F_SIZE(A6)
  19.     BSR    GET_SIZE_F
  20.     TST.W    D0
  21.     BGE    RTE_SIZE_OK
  22.     CLR.L    D0
  23.     RTS
  24. RTE_SIZE_OK:    MOVE.W    D0,FILELEN    SAVE LENGTH
  25.     MOVE.L    TEHND(A6),A3    TEHND IS POINTER TO POINTER
  26.     MOVE.L    (A3),D1
  27.     ADD.L    #62,D1
  28.     MOVE.L    D1,A3
  29.     MOVE.L    (A3),A0    HANDLE
  30.     LEA    PARAM_BLOCK,A4
  31.     MOVE.L    28(A4),D0    *FILESIZE
  32.     DC.W    SETHANDLESIZE    *TELL TE WE WANT THFILE SIZE BYTES
  33.     TST.L    D0
  34.     BEQ    TE_SIZE_OK
  35.     RTS
  36.     
  37. TE_SIZE_OK:    MOVE.L    TEHND(A6),A3
  38.     MOVE.L    (A3),A3    POINT TO TE RECORD
  39.     LEA    62(A3),A3    POINT TO HANDLE
  40.     MOVE.L    (A3),A3
  41.     MOVE.L    (A3),LONG_VAR(A6)    WHERE THE FILE IS TO GO
  42.     BSR    READ_F    READ IN FILE
  43.     BSR    CLOSE_F    CLOSE IT
  44.  
  45. **NOW RECALL THE TEXT INTO TE
  46.     MOVE.L    TEHND(A6),A3
  47.     MOVE.L    (A3),A3    TEREC
  48.     MOVE.W    FILELEN,60(A3)    SET LENGTH OF TEXT IN EDITOR RECORD
  49.     MOVE.L    TEHND(A6),-(SP)
  50.     DC.W    TECALTEXT    SET EDITOR GOING
  51.     CLR.L    -(SP)
  52.     CLR.L    -(SP)
  53.     MOVE.L    TEHND(A6),-(SP)
  54.     DC.W    TESETSELECT    SET SELECT INITIALLY
  55.     BSR    SETSCROLLMAX
  56.     RTS
  57.         
  58.  
  59. FILELEN:    DS.W    1
  60.  
  61. ******************SECTION 16******************************************************
  62. **NEEDS A0=FILENAME C FORMAT
  63. **D0=VOLPTR
  64.  
  65. SAVE_TE_FILE:    MOVE.L    TEHND(A6),A3    
  66.     MOVE.L    (A3),A3    TEREC
  67.     MOVE.L    A3,A1
  68.     LEA    62(A1),A1
  69.     MOVE.L    (A1),A1    TEHANDLE
  70.     MOVE.L    (A1),A1    POINT TO TEXT BUFFER
  71.     CLR.L    D1
  72.     MOVE.W    60(A3),D1    LENGTH OF TEXT
  73.     BSR.S    WRITE_F
  74.     RTS
  75.  
  76. ********************SECTION 17********************************************************
  77. ******************************
  78. *WRITE NEED:
  79. *A0=FILE NAME
  80. *A1=BUFFER TO WRITE
  81. *DO=VOLPTR
  82. *D1=LENGTH OF BUFFER
  83. WRITE_F:    MOVE.L     A1,-(A7)    *SAVE BUFFER ADDRESS FOR WRITE
  84.     MOVE.L     D1,-(A7)    *SAVE SIZE
  85.     MOVE.W    D0,D7    *SAVE VOLPTR
  86.     BSR     CLEAR_PB    *CLEAR PARAMETER BLOCK
  87.     MOVEA.L     A0,A3    *CONVERT FILENAME TO PASCAL
  88.     LEA     NEW_FNAME,A2    *PASCAL FILENAME BUILT HERE
  89.     MOVE.L    A3,-(A7)
  90.     MOVE.L    A2,-(A7)
  91.     BSR    CTOPSTR    *CONVERT TO PASCAL STRING
  92.     ADDQ.L    #8,A7
  93.     LEA    NEW_FNAME,A3
  94.     LEA    PARAM_BLOCK,A4    *FILE PARAMETER BLOCK FOR DISK IO
  95.     MOVE.L    A3,18(A4)    *FILE NAME
  96.     MOVE.W     D7,22(A4)    *VOL REF
  97.     MOVE.B    #0,26(A4)    *PERMISSION?????
  98.     MOVE.B    #2,27(A4)    *WRITE PLEASE
  99.     MOVE.L    #0,28(A4)    *USE HD BUFFER
  100.     MOVE.L    #OPEN,-(A7)    *CALL OPEN
  101.     MOVE.L    A4,-(A7)
  102.     BSR    MY_PBIO
  103.     ADDQ.L    #8,A7     *RETURN CODE IN D1=0 FOUND, -43 NOT FOUND
  104.     CMPI.W     #0,D1    *FILE EXISTS?
  105.     BEQ    DO_WRITE_F    *YUP SCRIBBLE TO IT.
  106.     CMPI.W    #-43,D1    *NOT FOUND?
  107.     BEQ    DO_CREATE_F    *NO, SO MAKE FILE
  108.     MOVE.W    #OPEN_OTHER,D0
  109.     BSR    DO_ALERT    *SOME KIND OF OPEN ERROR?
  110.     ADDQ.L    #8,A7    *A1 AND D1 IS ON STACK!
  111.     RTS
  112.  
  113. DO_CREATE_F:    LEA    PARAM_BLOCK,A4
  114.     MOVE.L    A3,18(A4)    *FILE NAME AS APSCAL STRING
  115.     MOVE.B    #0,26(A4)    *SET VERSION TO 0
  116.     MOVE.L    #CREATE,-(A7)
  117.     MOVE.L    A4,-(A7)
  118.     BSR    MY_PBIO    *CREATE FILE 
  119.     ADDQ.L    #8,A7
  120.     TST.W    D1    *ERROR?
  121.     BEQ    CREATE_OK    *NO
  122.     MOVE.W    #CREATE_ERROR,D0
  123.     BSR    DO_ALERT
  124.     ADDQ.L    #8,A7    *A1 D1 IS ON STACK
  125.     RTS
  126.  
  127. CREATE_OK:    LEA    PARAM_BLOCK,A4    *GET FILE INFO
  128.     MOVE.L    A3,18(A4)
  129.     MOVE.B    #0,26(A4)
  130.     MOVE.L    #0,28(A4)    *DIR INDEX
  131.     MOVE.L    #GET_INFO,-(A7)
  132.     MOVE.L    A4,-(A7)
  133.     BSR    MY_PBIO
  134.     ADDQ.L    #8,A7
  135.     LEA    PARAM_BLOCK,A4
  136.     MOVE.B    #'T',32(A4)    *SET CREATOR TYPE
  137.     MOVE.B    #'E',33(A4)
  138.     MOVE.B    #'X',34(A4)
  139.     MOVE.B    #'T',35(A4)
  140.     MOVE.L    #SET_INFO,-(A7)
  141.     MOVE.L    A4,-(A7)
  142.     BSR    MY_PBIO    *SET INFO
  143.     ADDQ.L    #8,A7
  144.  
  145.     LEA    PARAM_BLOCK,A4
  146.     MOVE.L    A3,18(A4)    *FILE NAME TO OPEN
  147.     MOVE.W    D7,22(A4)    *SET VOL REF
  148.     MOVE.B    #0,26(A4)    *PERMISSION
  149.     MOVE.B    #2,27(A4)    *WRITE 
  150.     MOVE.L    #0,28(A4)    *USE HD BUFFER
  151.     MOVE.L    #OPEN,-(A7)
  152.     MOVE.L    A4,-(A7)
  153.     BSR    MY_PBIO    *TRY TO OPEN AGAIN
  154.     ADDQ.L    #8,A7
  155.     TST.W    D1
  156.     BEQ    DO_WRITE_F        *FILE NOW OPEN OK
  157.     MOVE.W    CREATE2_ERROR,D0
  158.     BSR    DO_ALERT
  159.     ADDQ.L    #8,A7        *BECAUSE A1 AND D0 IS THERE
  160.     RTS
  161.  
  162. DO_WRITE_F:    MOVE.L    (A7)+,D0    *GET SIZE
  163.     MOVEA.L    (A7)+,A1    *GET BUFFER ADDRESS    
  164.     LEA    PARAM_BLOCK,A4
  165.     MOVE.L    A1,32(A4)    *ADDRESS OF BUFFER
  166.     MOVE.L    D0,36(A4)    *LENGTH OF BUFFER
  167.     MOVE.W    #1,44(A4)    *
  168.     MOVE.W    #0,46(A4)    *OFFSET
  169.     MOVE.L    #WRITE,-(A7)
  170.     MOVE.L    A4,-(A7)
  171.     BSR    MY_PBIO    *WRITE BUFFER
  172.     ADDQ.L    #8,A7
  173.     LEA    PARAM_BLOCK,A4
  174.     MOVE.L    40(A4),28(A4)    *STORE BYTE COUNT IN PARAM BLOCK
  175.     MOVE.L    #SET_EOF,-(A7)
  176.     MOVE.L    A4,-(A7)    *SET EOF
  177.     BSR    MY_PBIO
  178.     ADDQ.L    #8,A7
  179.     LEA    PARAM_BLOCK,A4
  180.     MOVE.L    #CLOSE,-(A7)
  181.     MOVE.L    A4,-(A7)
  182.     BSR    MY_PBIO    *CLOSE FILE
  183.     ADDQ.L    #8,A7
  184.     LEA    PARAM_BLOCK,A4
  185.     MOVE.L    #0,18(A4)    *FLUSH VOLUME
  186.     MOVE.L    #FLUSH,-(A7)
  187.     MOVE.L    A4,-(A7)
  188.     BSR    MY_PBIO
  189.     ADDQ.L    #8,A7
  190.     RTS        *PHEW!!!!!!!!!!!!!!!!!!!!
  191.  
  192. **READ_FILE NEEDS A0->FILENAME
  193. **      D0=VOLPTR
  194. **      LONGVAR(A6)->BUFFER ADDRESS
  195. READ_FILE:    BSR    OPEN_F
  196.     TST.W    D0
  197.     BMI    READ_FAILED
  198.     BSR    GET_SIZE_F
  199.     TST.W    D0
  200.     BMI    READ_FAILED
  201.     BSR    READ_F
  202.     BSR    CLOSE_F
  203.     RTS
  204. READ_FAILED:    MOVEQ    #-1,D0
  205.     RTS
  206.     
  207. ************OPEN:
  208. **NEEDS A0=FILENAME
  209. **      D0=VOLPTR
  210. **LONGVAR(A6)=BUFFER ADDRESS TO READ
  211. OPEN_F:    MOVE.W    D0,SAVE_VOLPTR
  212.     BSR    CLEAR_PB    *CLEAR PARAMETER BLOCK
  213.     LEA    PARAM_BLOCK,A4
  214.     MOVEA.L    A0,A3    *FILENAME
  215.     LEA    NEW_FNAME,A2
  216.     MOVE.L    A3,-(A7)
  217.     MOVE.L    A2,-(A7)
  218.     BSR    CTOPSTR    *CONVERT TO PASCAL FORMAT I.E. BYTE COUNT,STRING
  219.     ADDQ.L    #8,SP
  220.     LEA    NEW_FNAME,A3
  221.     MOVE.L    A3,18(A4)    *MOVE ADDRESS OF FILENAME TO PB
  222.     MOVE.W    SAVE_VOLPTR,22(A4)    *SET VOL REF
  223.     CLR.B    26(A4)    *PERMISSION
  224.     MOVE.B    #1,27(A4)    *READ STATUS
  225.     CLR.L    28(A4)    *USE VOLUME BUFFER
  226.     MOVE.L    #OPEN,-(SP)
  227.     MOVE.L    A4,-(SP)
  228.     BSR    MY_PBIO
  229.     ADDQ.L    #8,SP
  230.     TST.W    D1
  231.     BEQ    OPEN_OK
  232.     MOVEQ    #-1,D0
  233.     RTS        *NOT FOUND
  234. OPEN_OK:    CLR.L    D0
  235.     RTS
  236.     
  237. GET_SIZE_F:    MOVE.L    #GET_EOF,-(A7)
  238.     LEA    PARAM_BLOCK,A4
  239.     MOVE.L    A4,-(A7)
  240.     BSR    MY_PBIO    *GET FILE SIZE
  241.     ADDQ.L    #8,A7
  242.     LEA    PARAM_BLOCK,A4
  243.     MOVE.L    28(A4),D0    *SIZE IN D0
  244.     CMP.L    MAX_F_SIZE(A6),D0    *CHECK IT'L FIT
  245.     BGT    SIZE_ERROR
  246.     RTS
  247. SIZE_ERROR:
  248.     MOVE.W    #SIZE_ALERT,D0
  249.     BSR    DO_ALERT
  250.     MOVEQ    #-1,D0
  251.     RTS
  252.  
  253. READ_F:    LEA    PARAM_BLOCK,A4
  254.     MOVE.L    LONG_VAR(A6),32(A4) *WHERE THE BUFFER IS
  255.     MOVE.L    28(A4),36(A4)    *LENGTH OF DATA
  256.     MOVE.W    #0,44(A4)    *????
  257.     MOVE.L    #0,46(A4)    *NO OFFSET
  258.     MOVE.L    #READ,-(A7)
  259.     MOVE.L    A4,-(A7)
  260.     BSR    MY_PBIO    *READ FILE INTO BUFFER
  261.     ADDQ.L    #8,A7
  262.     RTS
  263.  
  264. CLOSE_F:    MOVE.L    #CLOSE,-(A7)
  265.     LEA    PARAM_BLOCK,A4
  266.     MOVE.L    A4,-(A7)
  267.     BSR    MY_PBIO
  268.     ADDQ.L    #8,A7    *CLOSE THE FILE
  269.     RTS
  270.     
  271. ******************LEVEL 3 SUBS FOLLOW*********************
  272. CLEAR_PB:    MOVE.L    A4,-(SP)    SAVE A4
  273.     LEA    PARAM_BLOCK,A4
  274.     MOVEQ    #99,D0
  275. CPBLOOP:    MOVE.B    #0,(A4)+
  276.     DBF    D0,CPBLOOP
  277.     MOVE.L    (SP)+,A4
  278.     RTS
  279.  
  280. **MY PBIO EXPECTS TRAP NUMBER AND ADDRESS OF PB ON STACK
  281. **CALLS RELEVANT OS ROUTINE FOR FILE IO
  282. MY_PBIO:    LINK    A6,#$0000
  283.     MOVE.W    $E(A6),D0    TRAP NUMBER           
  284.     MOVEA.L    $8(A6),A0    GET ADDRESS OF PB
  285.     CMPI.W    #OPEN,D0    NOT ELEGANT!
  286.     BEQ    DO_OPEN
  287.     CMPI.W    #CLOSE,D0 
  288.     BEQ    DO_CLOSE
  289.     CMPI.W    #READ,D0
  290.     BEQ.S    DO_READ
  291.     CMPI.W    #GET_EOF,D0
  292.     BEQ.S    DO_GET_EOF
  293.     CMPI.W    #WRITE,D0
  294.     BEQ.S    DO_WRITE
  295.     CMPI.W    #SET_EOF,D0
  296.     BEQ.S    DO_SET_EOF
  297.     CMPI.W    #CREATE,D0
  298.     BEQ.S    DO_CREATE
  299.     CMPI.W    #GET_INFO,D0
  300.     BEQ.S    DO_GET_INFO
  301.     CMPI.W    #SET_INFO,D0
  302.     BEQ.S    DO_SET_INFO
  303. END:    MOVE.L    D0,D1
  304.     UNLK    A6
  305.     RTS
  306.  
  307. DO_READ:    DC.W    READ
  308.     BRA END
  309. DO_GET_EOF:    DC.W    GET_EOF
  310.     BRA END
  311. DO_WRITE:    DC.W    WRITE
  312.     BRA END
  313. DO_SET_EOF:    DC.W    SET_EOF
  314.     BRA END
  315. DO_CREATE:    DC.W    CREATE
  316.     BRA END
  317. DO_GET_INFO:    DC.W    GET_INFO
  318.     BRA END
  319. DO_SET_INFO    DC.W    SET_INFO
  320.     BRA END
  321. DO_OPEN:    DC.W    OPEN
  322.     BRA END
  323. DO_CLOSE:    DC.W    CLOSE
  324.     BRA END
  325.  
  326. *********************VARS FOLLOW*************************
  327. SAVE_VOLPTR:    DS.W    1
  328. PARAM_BLOCK:    DS.B    100    *100 BYTE PARAMETER BLOCK FOR FILE I/O
  329. NEW_FNAME:    DS.B    40
  330.     EVEN
  331.